"""
filter 有两个参数，第一个可以是函数或者为None，如果第一个为函数，则第二个可迭代数据里的每一个元素作为函数的参数进行计算，
把返回为True的值筛选出来；
如果为None，则直接将第二个参数中为True的值筛选出来
"""
temp = filter(None,[1,0,False,True])
lists = list(temp)
print(lists)

#筛选奇数的过滤器
def odd(x):
    return x%2
tmp = filter(odd,range(10))
print(list(tmp))
#转换为lambda表达式
tmp = filter(lambda x:x%2,range(10))
print(list(tmp))

"""
map 仍然是两个参数，一个函数，一个可迭代序列
将序列的每个元素作为函数的参数进行运算加工，
直到可迭代序列每个元素都加工完毕，返回所有加工后的元素构成的新序列
"""
tmp = map(lambda x:x*3,range(10))
print(list(tmp))
#输出 [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

#递归
# def recursion(n):
#     result = n
#     for i in range(1,n):
#         result *= i
#     return result
# number = int(input("请输入一个整数"))
# result = recursion(number)
# print("%d 的阶乘是：%d" % (number,result))

"""递归版本"""
# def factorial(n):
#     if n == 1:
#         return 1
#     else:
#         return n*factorial(n-1)
# number = int(input("请输入一个整数"))
# result = factorial(number)
# print("%d 的阶乘是：%d" % (number,result))


def fab(n):
    a1 =1
    a2 = 1
    a3 = 1
    if n < 1:
        print("输入有误！")
        return -1
    while (n-2)>0:
        a3 = a1 + a2
        a1 = a2
        a2 = a3
        n -= 1
    return a3
result = fab(20)
if result != -1 :
    print("总共有%d对小兔崽子诞生！" % result)

""" 递归实现 """
def fab2(n):
    if n < 1 :
        print("输入有误")
    if n ==1 or n == 2 :
        return 1
    else :
        return fab2(n-1) + fab2(n-2)
result = fab2(20)
if result != -1 :
    print("总共有%d对小兔崽子诞生！" % result)

def hannuo(n,x,y,z):
    if n == 1:
        print(x,'--->',z)
    else :
        hannuo(n-1,x,z,y)
        print(x,'--->',z)
        hannuo(n-1,y,x,z)
n = int(input("请输入汉诺塔的层数："))
hannuo(n,'X','Y','Z')
